# 与java类似，python也有面向对象的概念
# 有类和对象，封装、继承、多态
# 创建类：
class Cat:

    # 类属性，所有对象共享
    # 类似java的静态变量，属于类，所有对象共享，不属于对象
    cat_num = 0

    # __init__方法初始化对象，类似java的构造方法，第一个参数默认为self，类似java中的this
    def __init__(self, name, sex):
        print("这是初始化方法")
        # name和sex就是Cat的属性
        self.name = name # 实例属性
        self.sex = sex # 实例属性
        # 使用类名.属性名进行访问和赋值
        Cat.cat_num += 1

    # 实例方法：通过self调用其他实例方法和属性
    def eat(self, ):
        print(f"{self.name}小猫爱吃鱼")

    def drink(self, ):
        print(f"{self.name}小猫爱喝水")

    @classmethod
    def show_cat_num(cls):
        print(f"当前一共有{cls.cat_num}只猫")

    # 类似工具类中的方法，不访问实例变量和类变量
    @staticmethod
    def vail_name(name):
        if len(name) > 3:
            return True
        else:
            return False

    # __str__方法，返回一个字符串，打印对象时调用，类似java中的toString()
    def __str__(self):
        return f"猫的名字是: {self.name}，性别是: {self.sex}"


# 创建对象：
tom = Cat(name="Tom", sex="male")
print(tom, type(tom))
print(f"当前一共有{Cat.cat_num}只猫")
Cat.show_cat_num()

# 访问对象的属性
print(tom.name, tom.sex)

# 调用实例方法
tom.eat()
tom.drink()

# 调用静态方法
is_vail = Cat.vail_name("Tom")
print("is_vail", is_vail)

# 再创建一个对象
lazy_tom = Cat(name="Kitty", sex="female")
print(f"当前一共有{Cat.cat_num}只猫")
Cat.show_cat_num()

lazy_tom.eat()
lazy_tom.drink()
print(lazy_tom)
